package com.demo.bookstore.service.impl;

import com.demo.bookstore.bean.Book;
import com.demo.bookstore.bean.Cart;
import com.demo.bookstore.bean.CartItem;
import com.demo.bookstore.service.CartService;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author ddone
 * @date 2024/3/16-12:31
 */
public class CartServiceImpl implements CartService {
    @Override
    public int addCart(Cart cart, Book book) {
        int bookId = book.getId();
        Map<Integer, CartItem> itemMap = cart.getItemMap();
        CartItem cartItem = itemMap.getOrDefault(bookId, new CartItem());

        cartItem.setBook(book);
        cartItem.setCount(cartItem.getCount() + 1);
        itemMap.put(bookId, cartItem);
        cart.setItemMap(itemMap);
        cart.setTotalCount(itemMap.size());
        cart.getItemList().add(cartItem);
        return cart.getTotalCount();
    }


    @Override
    public void setCartItems(Cart cart) {
        List<CartItem> itemList = new ArrayList<>(cart.getItemMap().values());
        double totalAmount = itemList.stream()
                .peek(cartItem -> {
                    BigDecimal priceDecimal = BigDecimal.valueOf(cartItem.getBook().getPrice());
                    BigDecimal countDecimal = new BigDecimal(cartItem.getCount()+"");
                    cartItem.setAmount(priceDecimal.multiply(countDecimal).doubleValue());
                })
                .mapToDouble(CartItem::getAmount)
                .sum();
        int totalCount = itemList.stream()
                .mapToInt(CartItem::getCount)
                .reduce(0, Integer::sum);
        cart.setItemList(itemList);
        cart.setTotalAmount(totalAmount);
        cart.setTotalCount(totalCount);
    }

    @Override
    public void deleteItemByBookId(Cart cart, String bookId) {
        Map<Integer, CartItem> itemMap = cart.getItemMap();
        itemMap.remove(Integer.parseInt(bookId));
    }

    @Override
    public void updateCount(Cart cart, String bookId, String count) {
        Map<Integer, CartItem> itemMap = cart.getItemMap();
        int id = Integer.parseInt(bookId);
        CartItem cartItem = itemMap.get(id);
        cartItem.setCount(Integer.parseInt(count));
        itemMap.put(id, cartItem);
        cart.setItemMap(itemMap);
    }
}
